﻿using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
using CRUD.DAO;
using CapaGestion.Spring;
using GestionadorBaseDatos;
using CapaNegocios;
using System.Runtime.Serialization;
using System.Collections.Generic;


namespace KamaldeWebService
{
    /// <summary>
    /// Expone diversos metodos requeridos para ingresar o consultar informacion en Kamalde
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    // Para permitir que se llame a este servicio web desde un script, usando ASP.NET AJAX, quite la marca de comentario de la línea siguiente. 
    [System.Web.Script.Services.ScriptService]

    [Serializable]
    public class Service1 : System.Web.Services.WebService
    {
        /// <summary>
        /// Retorna un obteto con los participantes y sus respectivas proporciones dada la fecha del evento
        /// </summary>
        [WebMethod]
        public ProporcionParticipante GetProporciones(DateTime FechaEvento, string Participante1, string Participante2)
        {
            IGestionEvento gestionEvento = AdministradorGestion.getGestionarEvento();
            Evento diaEvento = new Evento();
            diaEvento.FechaEvento = FechaEvento;
            IList eventos = gestionEvento.GetByDia(diaEvento);

            Participante participante = new Participante();
            ProporcionParticipante proporcionParticipante = new ProporcionParticipante();
            int cuentaEntradas = 0;

            foreach (Evento evento in eventos)
            {
                if (evento.FechaEvento.Equals(FechaEvento))
                {
                    IList listaProporcion = evento.Proporciones;
                    int contadorProporciones = listaProporcion.Count;

                    foreach (Proporcion proporcion in evento.Proporciones)
                    {
                        participante = gestionEvento.GetParticipante(proporcion.Participante);

                        if (participante.Nombre.Equals(Participante1))
                        {
                            proporcionParticipante.Participa1 = participante.Nombre;
                            proporcionParticipante.Proporcion1 = proporcion.ProporcionParticipante;
                            proporcionParticipante.ProporcionEmpate = proporcion.ProporcionEmpate;
                            cuentaEntradas += 1;
                        }
                        else
                        {
                            if (participante.Nombre.Equals(Participante2))
                            {
                                proporcionParticipante.Participa2 = participante.Nombre;
                                proporcionParticipante.Proporcion2 = proporcion.ProporcionParticipante;
                                cuentaEntradas += 1;
                            }
                            else
                            {
                                proporcionParticipante.Participa1 = null;
                                proporcionParticipante.Participa2 = null;
                                proporcionParticipante.Proporcion1 = 0;
                                proporcionParticipante.Proporcion2 = 0;
                            }
                        }

                        if ((proporcionParticipante.Participa1 != null) && (proporcionParticipante.Participa2 != null) && (cuentaEntradas == contadorProporciones))
                        {
                            return proporcionParticipante;
                        }
                        else
                        {
                            if (cuentaEntradas == contadorProporciones)
                            {
                                proporcionParticipante = null;
                                return proporcionParticipante;
                            }
                        }
                    }

                }
                else
                {
                    if ((proporcionParticipante.Participa1 != null) && (proporcionParticipante.Participa2 != null))
                    {
                        return proporcionParticipante;
                    }
                    else
                    {
                        return proporcionParticipante;
                    }
                }
            }
            return proporcionParticipante;
        }

        /// <summary>
        /// Registra una apuesta dado el Nickname del usuario que va a realizar la apuesta, la fecha del evento en el que 
        /// quiere apostar, la forma de pago que utilizara para hacer la apuesta, el participante por el que desea apostar y 
        /// el monto a apostar
        /// </summary>
        [WebMethod]
        public string RegistrarApuesta(string NickName, DateTime FechaEvento, string formaPago, string ParticipanteEscogido, int Monto)
        {
            string Respuesta = "La apuesta se ha realizado con exito =D";

            IGestionEvento gestionEvento = AdministradorGestion.getGestionarEvento();
            Evento diaEvento = new Evento();
            diaEvento.FechaEvento = FechaEvento;
            IList eventos = gestionEvento.GetByDia(diaEvento);

            Participante participante = new Participante();
            participante.Nombre = ParticipanteEscogido;

            IGestionApuesta gestionarApuesta = AdministradorGestion.getGestionarApuesta();
            Apuesta apuesta = new Apuesta();

            IGestionFormaPago gestionarFormaPago = AdministradorGestion.getGestionarFormaPago();
            FormaPago FormaPagoUtilizada = new FormaPago();
            FormaPagoUtilizada.Nombre = formaPago;
            FormaPagoUtilizada = gestionarFormaPago.GetByNombre(FormaPagoUtilizada);

            IGestionUsuario gestionarUsuario = AdministradorGestion.getGestionarUsuario();
            Usuario usuario = new Usuario();
            usuario = gestionarUsuario.ObtenerUsuarioPorNickname(NickName);

            Pago pago = new Pago();
            pago.UsuarioAsociado = usuario;
            pago.FormaPagoAsociado = FormaPagoUtilizada;

            int CuentaEntradas = 0;

            foreach (Evento evento in eventos)
            {
                if (evento.FechaEvento.Equals(FechaEvento))
                {
                    IList listaProporcion = evento.Proporciones;

                    foreach (Proporcion proporcion in listaProporcion)
                    {
                        if (proporcion.Participante.Nombre.Equals(ParticipanteEscogido))
                        {
                            apuesta.ProporcionAsociado = proporcion;
                            apuesta.FechaApuesta = DateTime.Now;
                            apuesta.Monto = Monto;
                            apuesta.PagoAsociado = pago;

                            gestionarApuesta.Insert(apuesta);

                            apuesta.IdApuesta = gestionarApuesta.GetAll().Count;
                            gestionarApuesta.EnviarCorreoConFactura(usuario, apuesta, evento, participante, proporcion);

                            CuentaEntradas++;
                        }
                        else
                        {
                            if (CuentaEntradas == 1)
                            {
                                Respuesta = "La apuesta se ha realizado con exito =D";
                                return Respuesta;
                            }
                            else
                            {
                                Respuesta = "El Participante indicado no tiene un evento en esta fecha";
                            }
                        }
                    }
                }
                else
                {
                    if (CuentaEntradas == 1)
                    {
                        Respuesta = "La apuesta se ha realizado con exito =D";
                        return Respuesta;
                    }
                    else
                    {
                        Respuesta = "No existe un Evento en esta fecha";
                    }
                }
            }
            return Respuesta;
        }

        /// <summary>
        /// Retorna las ganacias de un usuario dado su Nickname
        /// </summary>
        [WebMethod]
        public List<GananciaUsuario> GetGanancias(string NickName)
        {
            IGestionApuesta gestionarApuesta = AdministradorGestion.getGestionarApuesta();
            List<Apuesta> apuestas = new List<Apuesta>();
            apuestas = gestionarApuesta.getGanancias(NickName).Cast<Apuesta>().ToList<Apuesta>();

            List<GananciaUsuario> listaApuestasGanadas = new List<GananciaUsuario>();
           
            int GananciaAcumulada = 0;

            foreach (Apuesta apuesta in apuestas)
            {
                GananciaUsuario gananciaUsuario = new GananciaUsuario();

                gananciaUsuario.FechaApuesta = apuesta.FechaApuesta.Date;
                gananciaUsuario.Usuario = NickName;
                gananciaUsuario.MontoApostado = apuesta.Monto;
                gananciaUsuario.Proporcion = apuesta.ProporcionAsociado.ProporcionParticipante;
                gananciaUsuario.ParticipanteGanador = apuesta.ProporcionAsociado.Participante.Nombre;
                gananciaUsuario.Evento = apuesta.ProporcionAsociado.EventoAsociado.NombreEvento;
                gananciaUsuario.MontoGanado = (gananciaUsuario.MontoApostado * gananciaUsuario.Proporcion);

                GananciaAcumulada = GananciaAcumulada + gananciaUsuario.MontoGanado;
                gananciaUsuario.MontoGanadoAcumulado = GananciaAcumulada;

                listaApuestasGanadas.Add(gananciaUsuario);
            }
            return listaApuestasGanadas;
        }

        [WebMethod]
        public ResultadoEvento GetResultados(DateTime FechaEvento, string Participante1, string Participante2)
        {
            IGestionEvento gestionEvento = AdministradorGestion.getGestionarEvento();
            Evento diaEvento = new Evento();
            diaEvento.FechaEvento = FechaEvento;
            IList eventos = gestionEvento.GetByDia(diaEvento);
            int cuentaEventos = eventos.Count;
            int cuentaEntradasEventos = 0;

            Participante participante = new Participante();
            ResultadoEvento resultadoEventos = new ResultadoEvento();
            int cuentaEntradas = 0;

            foreach (Evento evento in eventos)
            {
                if (evento.FechaEvento.Equals(FechaEvento))
                {
                    IList listaProporcion = evento.Proporciones;
                    int contadorProporciones = listaProporcion.Count;

                    foreach (Proporcion proporcion in evento.Proporciones)
                    {
                        participante = gestionEvento.GetParticipante(proporcion.Participante);

                        if (participante.Nombre.Equals(Participante1))
                        {
                            resultadoEventos.Participa1 = participante.Nombre;
                            resultadoEventos.Resultado1 = proporcion.Ganador;
                            cuentaEntradas += 1;
                        }
                        else
                        {
                            if (participante.Nombre.Equals(Participante2))
                            {
                                resultadoEventos.Participa2 = participante.Nombre;
                                resultadoEventos.Resultado2 = proporcion.Ganador;
                                cuentaEntradas += 1;
                            }
                            else
                            {
                                resultadoEventos.Participa1 = null;
                                resultadoEventos.Participa2 = null;
                                resultadoEventos.Resultado1 = null;
                                resultadoEventos.Resultado2 = null;
                            }
                        }

                        if ((resultadoEventos.Participa1 != null) && (resultadoEventos.Participa2 != null) && (cuentaEntradas == contadorProporciones))
                        {
                            return resultadoEventos;
                        }
                        else
                        {
                            if (cuentaEntradas == contadorProporciones)
                            {
                                resultadoEventos = null;
                                return resultadoEventos;
                            }
                        }
                    }

                }
                else
                {
                    if ((resultadoEventos.Participa1 != null) && (resultadoEventos.Participa2 != null))
                    {
                        return resultadoEventos;
                    }
                    else
                    {
                        if (cuentaEventos == cuentaEntradasEventos)
                        {
                            resultadoEventos = null;
                            return resultadoEventos;
                        }
                    }
                }
                cuentaEntradasEventos++;
            }
            return resultadoEventos;
        }
    }
}
